SMTPサーバのメール送信テストにmailxコマンドを使う
はじめに
クラウド上に構築するシステムにおいても、SMTPサーバの重要性はオンプレミスと変わりません。アプリケーションからのメール送信、監視システムからの通知メール、管理者向けのroot宛メールの転送、などなど...sendmailやpostfixなどを使ったSMTPサーバの構築は今もなお一般的に行われています。
しかし、Linuxサーバなどからメール送信テストを行おうとしても、通常GUIを備えたリッチなメールクライアントなどはありません。このためCUIでコマンドラインによってメール送信を行う必要があります。
本投稿ではコマンドラインでメールを送信するmailxコマンドの使い方をまとめました。
mailxコマンドの使い方
mailxのインストール
Amazon LinuxやCentOSでは、初期状態でmailコマンドが入っていません。このためmailxパッケージを追加インストールします。
$ sudo yum install mailx (...snip...) インストール: mailx.x86_64 0:12.4-8.8.amzn1 完了しました!
なお、mailxをインストールするとmailコマンドが作成されますが、実体はmailxコマンドです。
$ ls -alF /bin/mail lrwxrwxrwx 1 root root 22 2015-05-26 20:29 /bin/mail -> /etc/alternatives/mail* $ ls -alF /etc/alternatives/mail lrwxrwxrwx 1 root root 10 2015-05-26 20:29 /etc/alternatives/mail -> /bin/mailx*
メールを送信する
メールを送信するときには、mailコマンドの後に送信先のメールアドレスを付与します。この際に使用されるSMTPサーバはlocalhostになります。続けてSubjectと本文を入力し、.によって本文の終わりを宣言します。
$ mail smokeymonkey@gmail.com Subject: tset mail test . EOT
メール本文の内容をファイルから読み込むにはリダイレクトを使います。
$ mail smokeymonkey@gmail.com < data.txt
上記のやり方だと、メール本文はリダイレクトで読み込めますが、Subjectの指定ができません。Subjectの指定は-sで指定します。
$ mail -s "test mail" smokeymonkey@gmail.com < data.txt
SMTPサーバを指定する
特に何も設定せずにmailコマンドを使うと、SMTPサーバはlocalhostを利用します。別のサーバ上に構築されたSMTPサーバを指定するには、~/.mailrcに設定します。
$ vi ~/.mailrc set smtp=smtp://192.168.0.1:25
Fromアドレスを指定する
何も設定しない場合、送信したメールのFromアドレスは「ユーザ名@ローカルのホスト名」になります。EC2の場合だと「ec2-user@ip-12-34-56-78.ap-northeast-1.compute.internal」みたいな感じです。Fromアドレスを指定する場合には-rオプションで指定します。
$ mail -r ec2-user@example.com smokeymonkey@gmail.com
前述した~/.mailrcで指定することもできます。
$ vi ~/.mailrc set from="ec2-user@example.com"
送信アカウントを使い分ける
~/.mailrcを使って、送信アカウントの定義を複数作成することが出来ます。例えば上述したFromアドレスが違う送信アカウントを複数作ります。
$ vi ~/.mailrc account hoge { set from="hoge@example.com" } account fuga { set from="fuga@example.com" }
そしてメールを送信するときに-Aオプションで使用する送信アカウントを指定します。例えばhogeを指定すれば、Fromアドレスはhoge@example.comになります。
$ mail -A hoge smokeymonkey@gmail.com
ファイルを添付する
ファイルを添付するには-aオプションを使います。
$ mail -a ./data.txt smokeymonkey@gmail.com
CC、BCCを指定する
CCでメールを送信するには-cオプションを、BCCでメールを送信するには-bオプションを使います。
$ mail -c smokeymonkey+cc@gmail.com -b smokeymonkey+bcc@gmail.com smokeymonkey@gmail.com
送信先メールアドレスにaliasを設定する
~/.mailrcでaliasを定義することで、送信先メールアドレスをグルーピングすることが出来ます。
$ vi ~/.mailrc alias smoke smokeymonkey@gmail.com sasaki.daisuke@classmethod.jp
これで、以下のようにmailコマンドの後にalias名を指定することで、一度に複数のメールアドレスにメールを送信することが出来ます。
$ mail smoke
なお、普通にmailコマンドの後にスペース区切りで複数のメールアドレスを記述することでも、一度にメールを送信することが出来ます。
$ mail smokeymonkey@gmail.com sasaki.daisuke@classmethod.jp
メール送信の通信ログを確認する
-vオプションを付与することで、メール送信時の通信ログの詳細を確認出来ます。
$ mail -v -s "test mail" smokeymonkey@gmail.com < data.txt Resolving host 192.168.0.1 . . . done. Connecting to 192.168.0.1 . . . connected. 220 mail.example.com ESMTP Postfix >>> HELO ip-12-34-56-78.ap-northeast-1.compute.internal 250 mail.example.com >>> MAIL FROM:<ec2-user@example.com> 250 2.1.0 Ok >>> RCPT TO:<smokeymonkey@gmail.com> 250 2.1.5 Ok >>> DATA 354 End data with <CR><LF>.<CR><LF> >>> . 250 2.0.0 Ok: queued as E445B45EE6 >>> QUIT 221 2.0.0 Bye
さいごに
よく使うわりには細かい実行オプションをいつも忘れてしまうので、これは自分用の備忘録です。自分でこの記事をブックマークしておこうと思います。